SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO


CREATE PROCEDURE [dbo].[LIQAguinaldoDeServiciosBajados] 
	@CabeceraDeLiquidacion INT,
	@IdLiquidacionActual INT,
	@ConceptoATotalizar INT,
	@EsSuplente BIT 
AS

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-- REGISTRO DE ACTUALIZACIONES
-- 09/07/2006 - Los parametros se obtienen de la funcion fnObtenerValorDeParametro con la fecha que corresponda.
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

SET NOCOUNT ON
SET DATEFORMAT DMY 

DECLARE @AguinaldoHasta DATETIME
DECLARE @AguinaldoDesde DATETIME
DECLARE @Hasta DATETIME, @Desde DATETIME
DECLARE @MesesDeAguinaldo INT
DECLARE @AuxAguinaldoDesde VARCHAR(10)
DECLARE @Afiliacion INT, @Agente INT, @ServicioAgente INT
DECLARE @Remunerativo DECIMAL(18,4)
DECLARE @SAC DECIMAL(18,4)
DECLARE @MaximoHaber DECIMAL(18,4)
DECLARE @FechaAlta DATETIME
DECLARE @FechaBaja DATETIME
DECLARE @TotalDiasSinGoce INT
DECLARE @DiasDeAguinaldo INT
DECLARE @TotalDiasTrabajados INT
DECLARE @CantidadDeAguinaldos DECIMAL(18,4)
DECLARE @SubOrganizacion INT
DECLARE @Horas INT
DECLARE @Organizacion INT
DECLARE @SituacionRevista INT
DECLARE @AporteObraSocial DECIMAL(18,4)
DECLARE @AporteJubilatorio DECIMAL(18,4)
DECLARE @PorcentajeDeAporte DECIMAL(18,4)
DECLARE @PorcentajeDeAporteOSocial DECIMAL(18,4)
DECLARE @PorcentajeDeContribucion DECIMAL(18,4)
DECLARE @PorcentajeDeContribucionOSocial DECIMAL(18,4)
DECLARE @ContribucionJubilatoria DECIMAL(18,4)
DECLARE @ContribucionOSocial DECIMAL(18,4)
DECLARE @Plaza INT
DECLARE @PorcentajeDeSubsidio DECIMAL(18,4)
DECLARE @TotalDeSubsidio DECIMAL(18,4)
DECLARE @OrganizacionLiquidacion INT

SELECT @AporteObraSocial = 0, @AporteJubilatorio = 0
SELECT @MaximoHaber = 0, @Remunerativo = 0
SELECT @ContribucionJubilatoria = 0, @ContribucionOSocial = 0
SELECT @OrganizacionLiquidacion = Organizacion FROM tb_Liquidaciones WHERE IdLiquidacion = @IdLiquidacionActual

--SELECT @PorcentajeDeAporte = CONVERT(DECIMAL(18,4), Valor1) FROM tb_Parametros WHERE Parametro = '%AporteJubilatorio'
--SELECT @PorcentajeDeAporteOSocial = CONVERT(DECIMAL(18,4), Valor1) FROM tb_Parametros WHERE Parametro = '%AporteObraSocial'
--SELECT @PorcentajeDeContribucion = CONVERT(DECIMAL(18,4), Valor1) FROM tb_Parametros WHERE Parametro =  '%ContribucionJubilatoriaPatronal'
--SELECT @PorcentajeDeContribucionOSocial = CONVERT(DECIMAL(18,4), Valor1) FROM tb_Parametros WHERE Parametro = '%ContribucionObraSocialPatronal'
--SELECT @CantidadDeAguinaldos = CONVERT(DECIMAL(18,4), Valor1) FROM tb_Parametros WHERE Parametro = 'CantidadDeAguinaldosAPagar'

SELECT @PorcentajeDeAporte = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('%AporteJubilatorio', @Hasta))
SELECT @PorcentajeDeAporteOSocial = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('%AporteObraSocial', @Hasta))
SELECT @PorcentajeDeContribucion = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('%ContribucionJubilatoriaPatronal', @Hasta))
SELECT @PorcentajeDeContribucionOSocial = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('%ContribucionObraSocialPatronal', @Hasta))
SELECT @CantidadDeAguinaldos = CONVERT(DECIMAL(18,4), dbo.fnObtenerValorDeParametro ('CantidadDeAguinaldosAPagar', @Hasta))


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--- OJO CON LAS FECHAS! Se pusieron a mano para calculo en enero
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

IF @EsSuplente=1
    SELECT @Desde = DesdeSuplente, @Hasta=HastaSuplente  FROM Tb_CabeceraDeLiquidacion  WHERE IDCabeceraDeLiquidacion =  @CabeceraDeLiquidacion
ELSE
    SELECT @Desde = Desde, @Hasta=Hasta  FROM Tb_CabeceraDeLiquidacion  WHERE IDCabeceraDeLiquidacion =  @CabeceraDeLiquidacion

SET @AguinaldoHasta = @Hasta

-- Para armar la FECHA DESDE EL AGUINALDO. ESTO SE TIENE QUE HABILITAR
IF MONTH(@AguinaldoHasta) > @MesesDeAguinaldo
	SELECT @AuxAguinaldoDesde = '01/07/' + CONVERT(VARCHAR, YEAR(@AguinaldoHasta))
ELSE
	SELECT @AuxAguinaldoDesde = '01/01/' + CONVERT(VARCHAR, YEAR(@AguinaldoHasta))

SELECT @AguinaldoDesde = CONVERT(DATETIME, @AuxAguinaldoDesde)

--SELECT @AguinaldoDesde = '01/07/2005', @AguinaldoHasta = '31/12/2005'

SELECT @DiasDeAguinaldo = DATEDIFF(DAY, @AguinaldoDesde, @AguinaldoHasta)+1

-- CURSOR CON LOS SERVICIOS A LIQUIDAR
DECLARE ServiciosBajados  CURSOR  FORWARD_ONLY FOR
SELECT Agente, ServicioAgente, Organizacion, SubOrganizacion, SituacionRevista, S.Horas, Plaza, S.FechaBaja
FROM tb_ServiciosAgentes S
INNER JOIN tb_SubServiciosAgentes SS ON IdServicioAgente = ServicioAgente
INNER JOIN tb_Organizaciones O ON IdOrganizaciones = UbicacionOrig
INNER JOIN tb_Plazas ON idPlaza = Plaza
WHERE 
EsPrivada = 'S' 
AND S.FechaBaja IS NOT NULL
AND S.FechaBaja BETWEEN @AguinaldoDesde AND DATEADD(MONTH, 1, S.FechaBaja)
AND ((@EsSuplente = 1 AND SituacionRevista = 4) OR (@EsSuplente = 0 AND SituacionRevista IN (1,2,3)))
AND NOT EXISTS (SELECT * FROM tb_RegistroDeLiquidaciones INNER JOIN tb_Liquidaciones L ON idLiquidacion = Liquidacion WHERE Concepto = @ConceptoATotalizar AND Servicio = ServicioAgente AND  L.Desde >= @AguinaldoDesde AND L.Hasta <= @AguinaldoHasta)
AND (SS.FechaBaja = S.FechaBaja)
AND UbicacionOrig = @OrganizacionLiquidacion

PRINT 'HORA DE INICIO....'+CONVERT(VARCHAR, GETDATE())

OPEN ServiciosBajados

FETCH NEXT FROM ServiciosBajados INTO @Agente, @ServicioAgente, @Organizacion, @SubOrganizacion, @SituacionRevista,  @Horas, @Plaza, @FechaBaja

WHILE @@FETCH_STATUS = 0
BEGIN

	PRINT 'CALCULANDO AGUINALDO A SERVICIO...' + CONVERT(VARCHAR, @ServicioAgente)

	--Se obtiene el Maximo Remunerativo que haya tenido el servicio en el periodo correspondiente.
	SELECT @Remunerativo = MAX(R.MontoHaberes+ISNULL(R2.MontoHaberes,0.0)) 
	FROM tb_RegistroDeLiquidaciones R, tb_RegistroDeLiquidaciones R2, tb_Liquidaciones L, tb_RegistroDeLiquidaciones R3 
	WHERE idLiquidacion = R.Liquidacion
		And R.Concepto = 16 
		--And ((@EsSuplente = 1 AND L.DesdeSuplentes >= @AguinaldoDesde And L.HastaSuplentes <= @AguinaldoHasta) 
		--	OR 
		--        (@EsSuplente = 0 AND L.Desde >= @AguinaldoDesde And L.Hasta <= @AguinaldoHasta))
		And L.Desde >= @AguinaldoDesde And  L.Mes <= MONTH(@FechaBaja) And L.Anio =YEAR(@FechaBaja)
		And R.Servicio = @ServicioAgente And R2.Servicio = R.Servicio
		And R.Liquidacion = R2.Liquidacion And R2.Concepto = 9 
		AND L.Tipo = 4 --Agregado   05/12/2005
		AND R3.Liquidacion = R.Liquidacion AND R3.Servicio = R.Servicio AND R3.Concepto = 29 AND R3.MontoHaberes < 32

	PRINT 'Remunerativo Maximo: ' + CONVERT(VARCHAR, @Remunerativo)

	SELECT @MaximoHaber = @Remunerativo * @CantidadDeAguinaldos

	PRINT 'Maximo Haber: ' + CONVERT(VARCHAR, @MaximoHaber)

	SELECT @TotalDiasTrabajados = DATEDIFF(DAY, (CASE WHEN FechaAlta < @AguinaldoDesde THEN @AguinaldoDesde ELSE FechaAlta END), FechaBaja)+1 FROM tb_ServiciosAgentes WHERE idServicioAgente = @ServicioAgente

	PRINT 'Dias Trabajados: ' + CONVERT(VARCHAR, @TotalDiasTrabajados)

	-- Cantidad de dias sin goce que ha tenido en el periodo
	SELECT @TotalDiasSinGoce = SUM(MontoHaberes) 
	FROM tb_RegistroDeLiquidaciones 
	INNER JOIN tb_Liquidaciones L ON IdLiquidacion = Liquidacion
	WHERE Concepto = 27 AND Servicio = @ServicioAgente
	AND  L.Desde >= @AguinaldoDesde AND L.Mes <= MONTH(@FechaBaja) And L.Anio =YEAR(@FechaBaja)

	IF @TotalDiasSinGoce IS NULL
		SELECT @TotalDiasSinGoce = 0

	PRINT 'Total Dias Sin Goce: ' + CONVERT(VARCHAR, @TotalDiasSinGoce)

	SELECT @TotalDiasTrabajados = @TotalDiasTrabajados - @TotalDiasSinGoce
	IF @TotalDiasTrabajados < 0
		SELECT @TotalDiasTrabajados = 0

	-- Calculo del Aguinaldo
	SELECT @SAC = (@TotalDiasTrabajados * @MaximoHaber) / @DiasDeAguinaldo

	PRINT 'SAC: ' + CONVERT(VARCHAR, @SAC)

	IF @SAC > 0
	BEGIN
		INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
		VALUES (NULL, @Afiliacion, @Agente, NULL, 1, NULL, @ConceptoATotalizar, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @SAC, @Organizacion, NULL, @ServicioAgente, @SituacionRevista, @TotalDiasTrabajados, @SubOrganizacion)

		IF NOT EXISTS(SELECT * FROM tb_RegistroDeLiquidaciones WHERE Servicio = @ServicioAgente AND Concepto = 20 AND Liquidacion = @IdLiquidacionActual)
			--SUELDO BRUTO
			INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
			VALUES (NULL, @Afiliacion, @Agente, NULL, 1, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @SAC, @Organizacion, NULL, @ServicioAgente, @SituacionRevista, @TotalDiasTrabajados, @SubOrganizacion)
		ELSE
			UPDATE tb_RegistroDeLiquidaciones SET MontoHaberes = MontoHaberes + @SAC  WHERE Servicio = @ServicioAgente AND Concepto = 20 AND Liquidacion = @IdLiquidacionActual

		SELECT @AporteJubilatorio = @SAC * @PorcentajeDeAporte / 100
		SELECT @AporteObraSocial = @SAC * @PorcentajeDeAporteOSocial / 100
		SELECT @ContribucionJubilatoria = @SAC * @PorcentajeDeContribucion  / 100
		SELECT @ContribucionOSocial = @SAC * @PorcentajeDeContribucionOSocial  / 100
		SELECT @PorcentajeDeSubsidio = PorcentajeSubsidio FROM tb_Plazas WHERE idPlaza = @Plaza
		SELECT @TotalDeSubsidio = (@SAC * @PorcentajeDeSubsidio / 100) + @ContribucionJubilatoria + @ContribucionOSocial


		IF NOT EXISTS(SELECT * FROM tb_RegistroDeLiquidaciones WHERE Servicio = @ServicioAgente AND Concepto = 22 AND Liquidacion = @IdLiquidacionActual)
			--PORCENTAJE DE SUBSIDIO
			INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
			VALUES (NULL, @Afiliacion, @Agente, NULL, 1, NULL, 22, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @PorcentajeDeSubsidio, @Organizacion, NULL, @ServicioAgente, @SituacionRevista, @TotalDiasTrabajados, @SubOrganizacion)

		IF NOT EXISTS(SELECT * FROM tb_RegistroDeLiquidaciones WHERE Servicio = @ServicioAgente AND Concepto = 24 AND Liquidacion = @IdLiquidacionActual)
			INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
			VALUES (NULL, @Afiliacion, @Agente, NULL, 1, NULL, 24, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @TotalDeSubsidio, @Organizacion, NULL, @ServicioAgente, @SituacionRevista, @TotalDiasTrabajados, @SubOrganizacion)
		ELSE
			UPDATE tb_RegistroDeLiquidaciones SET MontoHaberes = MontoHaberes + @TotalDeSubsidio WHERE Servicio = @ServicioAgente AND Concepto = 24 AND Liquidacion = @IdLiquidacionActual

		INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
		VALUES (NULL, @Afiliacion, @Agente, NULL, 1, NULL, 10, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, @AporteJubilatorio, 0, @Organizacion, NULL, @ServicioAgente, @SituacionRevista, @TotalDiasTrabajados, @SubOrganizacion)

		INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
		VALUES (NULL, @Afiliacion, @Agente, NULL, 1, NULL, 13, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, @AporteObraSocial, 0, @Organizacion, NULL, @ServicioAgente, @SituacionRevista, @TotalDiasTrabajados, @SubOrganizacion)

		INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
		VALUES (NULL, @Afiliacion, @Agente, NULL, 1, NULL, 11, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, @ContribucionJubilatoria, 0, @Organizacion, NULL, @ServicioAgente, @SituacionRevista, @TotalDiasTrabajados, @SubOrganizacion)

		INSERT INTO tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
		VALUES (NULL, @Afiliacion, @Agente, NULL, 1, NULL, 15, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, @ContribucionOSocial, 0, @Organizacion, NULL, @ServicioAgente, @SituacionRevista, @TotalDiasTrabajados, @SubOrganizacion)

	END


	FETCH NEXT FROM ServiciosBajados INTO @Agente, @ServicioAgente, @Organizacion, @SubOrganizacion, @SituacionRevista,  @Horas, @Plaza,@FechaBaja

END

PRINT 'HORA DE FIN....'+CONVERT(VARCHAR, GETDATE())
PRINT 'SE TERMINA DE LIQUIDAR AGUINALDO A ' + CONVERT(VARCHAR, @OrganizacionLiquidacion)

CLOSE ServiciosBajados
DEALLOCATE ServiciosBajados
GO
